import socket
import threading

def receive_messages(client_socket):
    """接收服务器消息的线程函数"""
    while True:
        try:
            data = client_socket.recv(1024)
            if data:
                # 尝试解码为文本
                try:
                    if data.startswith(b'text:'):
                        message = data[5:].decode('utf-8')
                        print(f"\n[服务器文本] {message}")
                    else:
                        message = data.decode('utf-8')
                        print(f"\n[服务器] {message}")
                except UnicodeDecodeError:
                    # 如果不能解码为文本，显示十六进制
                    print(f"\n[服务器数据] {data.hex().upper()}")
                print("客户端> ", end="", flush=True)
            else:
                print("\n服务器断开连接")
                break
        except Exception as e:
            print(f"\n接收消息错误: {e}")
            break


def start_tcp_client(host='127.0.0.1', port=9010):
    """启动TCP客户端"""
    try:
        # 创建TCP套接字
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 连接到服务器
        client_socket.connect((host, port))
        print(f"已连接到服务器 {host}:{port}")

        # 启动接收消息的线程
        receive_thread = threading.Thread(target=receive_messages, args=(client_socket,), daemon=True)
        receive_thread.start()

        print("输入消息发送给服务器:")
        print("  - 直接输入文本: Hello World")
        print("  - 输入十六进制: hex:01030000000AC5CD")
        print("  - 输入 'cl_host <host> <port>': 创建 Modbus TCP 客户端")
        print("  - 输入 'cl <hex_command>': 使用 Modbus TCP 客户端发送命令")
        print("  - 输入 'quit' 退出")

        while True:
            try:
                message = input("客户端> ")

                if message.lower() == 'quit':
                    # 关闭 Modbus 客户端
                    print("Modbus TCP 客户端已关闭")

                elif message.lower().startswith('ch '):
                    # 创建 Modbus TCP 客户端
                    parts = message.split()
                    if len(parts) < 3:
                        print("用法: ch <host> <port>")
                        continue

                elif message.lower().startswith('cl '):
                    # 使用 Modbus TCP 客户端发送命令
                    print(f"发送 Modbus")

                elif message.strip():
                    if message.startswith('hex:'):
                        # 发送十六进制数据
                        hex_string = message[4:].replace(' ', '').replace('-', '').replace(':', '')
                        try:
                            if len(hex_string) % 2 != 0:
                                hex_string = '0' + hex_string
                            byte_data = bytes.fromhex(hex_string)
                            client_socket.send(byte_data)
                            print(f"已发送十六进制数据: {hex_string}")
                        except ValueError:
                            print("无效的十六进制格式")
                    else:
                        # 发送文本数据
                        client_socket.send(message.encode('utf-8'))

            except KeyboardInterrupt:
                print("\n正在断开连接...")
                break
            except Exception as e:
                print(f"发送消息错误: {e}")
                break

    except Exception as e:
        print(f"连接服务器失败: {e}")
    finally:
        try:
            client_socket.close()
            print("客户端已断开连接")
        except:
            pass


if __name__ == '__main__':
    import traceback
    import argparse
    

    print("TCP 客户端测试程序")

    try:
        # 解析命令行参数
        parser = argparse.ArgumentParser(description='TCP 客户端测试程序')
        parser.add_argument('--host', default='127.0.0.1', help='服务器IP地址 (默认: 127.0.0.1)')
        parser.add_argument('--port', type=int, default=9010, help='服务器端口 (默认: 9010)')
        parser.add_argument('--no-input', action='store_true', help='不提示输入，直接使用默认值或命令行参数')
        args = parser.parse_args()

        host = args.host
        port = args.port

        # 如果不是无输入模式，则提示用户输入
        if not args.no_input:
            host_input = input(f"请输入服务器IP (默认 {host}): ").strip()
            if host_input:
                host = host_input

            port_input = input(f"请输入服务器端口 (默认 {port}): ").strip()
            if port_input:
                port = int(port_input)
        
        print(f"正在连接到服务器 {host}:{port}")
        start_tcp_client(host, port)
    except Exception as e:
        print(f"程序出错: {e}")
        traceback.print_exc()
